package org.apli.haiam.admin.jsf.managed;

import com.apli.controladores.Aplinfo;
import com.apli.controladores.AplinfoFactoryBean;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmEmpleado;
import org.apli.haiam.ejb.interfaces.AdministradorLoginHaiam;
import org.apli.haiam.ejb.interfaces.AdministradorPerfilHaiam;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad AdmUsuario. <p>
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfEmpleado extends JsfBean<AdmEmpleado> {

    private boolean valido = true;
    final Logger log = LoggerFactory.getLogger(JsfEmpleado.class);
    @EJB
    private AdministradorPerfilHaiam adminPerfil;
    @EJB
    private AdministradorLoginHaiam adminLogin;
    private String consultaUsername;
    public int cadulaInc = 0;

    /**
     * Constructor por defecto.
     */
    public JsfEmpleado() {
        super();
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        object = new AdmEmpleado();
        object.setEstado(1);
        cadulaInc = 0;

        try {
            object.setFechaIngreso(admin.getFechaDb());
        } catch (Exception e) {
            log.error("obtene fecha() {} ", e.getMessage());

        }

    }

    /**
     * Método optener conexión a EJB de Perfiles.
     */
    @Override
    protected void cargarEjb() {
        super.cargarEjb();
        if (adminPerfil == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorPerfilBeanHaiam";
                adminPerfil = (AdministradorPerfilHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("cargarEjbPerfil() {} - {} ", ejbPath, e.getMessage());
            }
        }
        if (adminLogin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorLoginBeanHaiam";
                adminLogin = (AdministradorLoginHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("cargarEjbLogin() {} - {} ", ejbPath, e.getMessage());
            }
        }
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        object.setNombre(object.getNombre().toUpperCase());
        object.setApellido(object.getApellido().toUpperCase());
        object.setNombreFull(object.getApellido().concat(" ").concat(object.getNombre()));
        if (cadulaInc == 1) {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "cedula").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Cédula incorrecta", "Cédula incorrecta"));
        } else {
            if (object.getIdEmpleado() == null) {

                try {
                    if (!admin.existePorCampo(object.getClass(), "cedula", object.getCedula())) {
                        object.setEstado(1);
                        admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        inicializar();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nombre ya existe", "Nombre ya existe"));
                    }
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                }
            } else {
                try {
                    admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    inicializar();
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                }
            }
        }
        cargarLista();
        return null;
    }

    public void validarCedula() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (Aplinfo.isRucCedulaValido(object.getCedula()) == false) {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "cedula").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Cédula incorrecta", "Cédula incorrecta"));
            cadulaInc = 1;
        } else {
            cadulaInc = 0;
        }
    }

    /**
     * Obtiene la lista de objetos en un DataModel.
     */
    @Override
    public void cargarDataModel() {
//        if (admin == null) {
//            return;
//        }
//        try {
//            model = new ListDataModel(admin.listarOrdenada(object.getClass(), "nombre", true));
//        } catch (Exception e) {
//            log.error("getDataModel() {} ", e.getMessage());
//            model = null;
//        }
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
            List<AdmEmpleado> datos = admin.listarOrdenada(object.getClass(), "apellido", true);
            List<SelectItem> items = new ArrayList<>();
            for (AdmEmpleado obj : datos) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }

    public String getConsultaUsername() {
        return consultaUsername;
    }

    public void setConsultaUsername(String consultaUsername) {
        this.consultaUsername = consultaUsername;
    }

    public void setEstado(boolean estado) {
        if (object != null) {
            object.setEstado(estado ? 1 : 0);
        }
    }

    public boolean isEstado() {
        if (object != null && object.getEstado() != null) {
            return object.getEstado() == 1 ? true : false;
        }
        return false;
    }
}
